﻿/*
 * 功能：评价项值计算方法 
 * 作者：孙海娟 
 * 日期：2013/12/3
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using DQYT.HTDZ.Model;

namespace DQYT.HTDZ.BusinessService
{
   public class AnalysisElemsFun
   {

       #region  计算平均功率因数
       /// <summary>
       /// 计算平均功率因数
       /// </summary>
       /// <param name="dt"></param>
       /// <returns></returns>
       public double getPJGLYS(DataTable dt)
       {
           double pjglys;
           pjglys = getValueAveg(dt);
           return pjglys;
       }
       #endregion

       #region  计算电流最大值平衡率
       /// <summary>
       /// 计算电流最大值平衡率
       /// </summary>
       /// <returns></returns>
       public double getDLZDZPHL(DataTable dt)
       {
           double dlzdzphl;
           double up_max;
           double down_max;
           DataTable updata = null;//上行数据
           DataTable downdata = null;//下行数据

           //提取上行和下行数据
           // 复制表结构
           updata = dt.Clone();
           downdata = dt.Clone();
           int j = 0;
           for (int i = 0; i < dt.Rows.Count; i++)
           {

               if (i < dt.Rows.Count / 2)
               {
                   // 添加空行
                   DataRow row = updata.NewRow();
                   updata.Rows.Add(row);
                   updata.Rows[i][0] = dt.Rows[i][0];
               }
               else
               {
                   // 添加空行
                   DataRow row = downdata.NewRow();
                   downdata.Rows.Add(row);
                   downdata.Rows[j++][0] = dt.Rows[i][0];
               }
           }
           //最大值
           up_max = getValueMax(updata);
           down_max = getValueMax(downdata);
           //电流最大值平衡率 = 下行A相电流最大值/上行A相电流最大值
           dlzdzphl = down_max / up_max;
           return dlzdzphl;
       }
       #endregion

       #region  计算有功平均值平衡率
       /// <summary>
       /// 计算有功平均值平衡率
       /// </summary>
       /// <returns></returns>
       public double getYGPJZPHL(DataTable dt)
       {
           double ygpjzphl;
           double up_aveg; //上行有功平均值
           double down_aveg; //下行有功平均值
           DataTable updata = null;//上行数据
           DataTable downdata = null;//下行数据

           //提取上行和下行数据
           // 复制表结构
           updata = dt.Clone();
           downdata = dt.Clone();
           int j = 0;
           for (int i = 0; i < dt.Rows.Count; i++)
           {

               if (i < dt.Rows.Count / 2)
               {
                   // 添加空行
                   DataRow row = updata.NewRow();
                   updata.Rows.Add(row);
                   updata.Rows[i][0] = dt.Rows[i][0];
               }
               else
               {
                   // 添加空行
                   DataRow row = downdata.NewRow();
                   downdata.Rows.Add(row);
                   downdata.Rows[j++][0] = dt.Rows[i][0];
               }
           }
           //平均值
           up_aveg = getPosiValueAveg(updata);
           down_aveg = getPosiValueAveg(downdata);
           //有功平均值平衡率 = 下行有功平均值/上行有功平均值
           ygpjzphl = down_aveg / up_aveg;
           return ygpjzphl;
       }
       #endregion

       #region  计算有功最大值平衡率
       /// <summary>
       /// 计算有功最大值平衡率
       /// </summary>
       /// <param name="dt"></param>
       /// <returns></returns>
       public double getYGZDZPHL(DataTable dt)
       {
           double ygzdzphl;//有效最大值平衡率
           double up_max;
           double down_max;
           DataTable updata = null;//上行数据
           DataTable downdata = null;//下行数据
           
           //提取上行和下行数据
           // 复制表结构
           updata = dt.Clone();
           downdata = dt.Clone();
            int j = 0;
            for (int i = 0; i < dt.Rows.Count; i++)
            {

                if (i < dt.Rows.Count / 2)
                {
                    // 添加空行
                    DataRow row = updata.NewRow();
                    updata.Rows.Add(row);
                    updata.Rows[i][0] = dt.Rows[i][0];
                }
                else
                {
                    // 添加空行
                    DataRow row = downdata.NewRow();
                    downdata.Rows.Add(row);
                    downdata.Rows[j++][0] = dt.Rows[i][0];
                }
            }
            //最大值
            up_max = getValueMax(updata);
            down_max = getValueMax(downdata);
           
           //有功最大值平衡率=下行有效最大值/上行有效最大值
            ygzdzphl = down_max / up_max;
        
           return ygzdzphl;
       }
       #endregion

       #region  计算有功负值率
       /// <summary>
       /// 计算有功负值率
       /// </summary>
       /// <returns></returns>
       public double getYGFZL(DataTable dt)
       {
           double ygfzl;
           double posivalue = 0; //日有功正能耗
           double nagevalue = 0; //日有功负能耗
           int posivalue_num = 0;
           int nagevalue_num = 0;

           //负值率、日有功正能耗、日有功负能耗
           for (int i = 0; i < dt.Rows.Count; i++)
           {
               if ((double)dt.Rows[i][0] > 0)
               {
                   posivalue += (double)dt.Rows[i][0];
                   posivalue_num++;
               }
               else
               {
                   nagevalue += (double)dt.Rows[i][0];
                   nagevalue_num++;
               }

           }
           posivalue = (posivalue / posivalue_num) * 24;
           nagevalue = Math.Abs((nagevalue / nagevalue_num) * 24);
           ygfzl = nagevalue / (nagevalue + posivalue);

           return ygfzl;
       }
       #endregion


       /// <summary>
        /// 获得一组数中的最大值
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public double getValueMax(DataTable data)
        {
            double max = (double)data.Rows[0][0];
            for (int i = 1; i < data.Rows.Count; i++)
            {
                if ((double)data.Rows[i][0] >= max) max = (double)data.Rows[i][0];
            }
            return max;
        }
        /// <summary>
        /// 求一组数据的平均值
        /// </summary>
        /// <param name="?"></param>
        /// <returns></returns>
        public double getValueAveg(DataTable data)
        {
            int i;
            double aveg = 0;
            for (i = 0; i < data.Rows.Count; i++)
            {
                aveg += (double)data.Rows[i][0];
            }
            if (i == 0) return 0;
            aveg = aveg / i;
            return aveg;
        }
        /// <summary>
        /// 求一组数据的所有正数平均值
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public double getPosiValueAveg(DataTable data)
        {
            int i;
            double aveg = 0;
            for (i = 0; i < data.Rows.Count; i++)
            {
                if ((double)data.Rows[i][0] > 0)
                {
                    aveg += (double)data.Rows[i][0];
                }
            }
            aveg = aveg / i;
            return aveg;
        }
        /// <summary>
        /// 求一组数据的所有负数平均值
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public double getNageValueAveg(DataTable data)
        {
            int i;
            double aveg = 0;
            for (i = 0; i < data.Rows.Count; i++)
            {
                if ((double)data.Rows[i][0] < 0)
                {
                    aveg += (double)data.Rows[i][0];
                }
            }
            aveg = aveg / i;
            return aveg;
        }
                  

    }
}
